package com.sbl.dao.impl;

import com.sbl.dao.IAccountDao;
import com.sbl.domain.Account;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;

import java.util.List;

/**
 * 账户的持久层实现类
 *======  第一部分
 *      xml中发现有 <property> 注入，然后该类并没有setXX方法 ；然后追踪到JdbcDaoSupport 发现有setDataSource() 方法
 *      JdbcDaoSupport 是抽象类，有 private JdbcTemplate jdbcTemplate; 注入的时候要注入数据源或者模板
 *
 *      super.getJdbcTemplate ,获取实例对象，在bean.xml 中配置了
 *     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
 *         <property name="dataSource" ref="dataSource"></property>
 *     </bean>
 *
 * =====   第二部分
 *    Spring 的ORM 包提供了对许多ORM（对象关系映射）产品的支持。通常使用Spring提供的Template类
 *    BeanPropertyRowMapper 实现了 interface RowMapper<T>；这个类实现了Spring的ORM（对象关系映射，对象和数据库里的数据）
 *
 *
 */

public class AccountDaoImpl extends JdbcDaoSupport implements IAccountDao {


    public Account findAccountById(Integer accountId) {
       Account account = super.getJdbcTemplate().queryForObject("select * from account where id = ?",new BeanPropertyRowMapper<Account>(Account.class),accountId);
        return account;
    }


    public Account findAccountByName(String accountName) {
        List<Account> accounts = super.getJdbcTemplate().query("select * from account where name = ?",new BeanPropertyRowMapper<Account>(Account.class),accountName);
        if(accounts.isEmpty()){
            return null;
        }
        if(accounts.size()>1){
            throw new RuntimeException("结果集不唯一");
        }
        return accounts.get(0);
    }

    public void updateAccount(Account account) {
        super.getJdbcTemplate().update("update account set name=?,money=? where id=?",account.getName(),account.getMoney(),account.getId());
    }

}
